Skip to main content

NGINX-多服务分流与HTTPS 支持

本笔记总结了如何使用 NGINX 作为反向代理服务器,针对多个后端服务(如 Spring Boot 与其他服务),实现基于域名或路径的流量分流,并启用 HTTPS 支持。


📌 场景说明

服务器中部署了多个服务:

  • Spring Boot 启动于 8080 端口
  • 后台管理系统监听 80 端口
  • 希望通过 NGINX 实现:
    • 将不同的流量路由到对应服务
    • 启用统一的 HTTPS 证书
    • 支持通过不同子域名或路径访问

📁 方案一:基于域名分流(推荐)

🧱 架构示意


api.example.com ─┬─> NGINX 443 ──> Spring Boot (127.0.0.1:8080) admin.example.com ─┘ └─> 后台服务 (127.0.0.1:80)

🛠️ 配置步骤

1. 配置 DNS

在域名服务商控制台设置:


api.example.com → 服务器IP admin.example.com → 服务器IP

2. 申请 SSL 证书

推荐使用 Let's Encrypt。可以通过 certbot 工具快速申请泛域名或多域名证书。

3. NGINX 配置示例

# HTTP 自动跳转 HTTPS
server {
listen 80;
server_name api.example.com admin.example.com;
return 301 https://$host$request_uri;
}

# Spring Boot 服务(api 子域名)
server {
listen 443 ssl http2;
server_name api.example.com;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

# 后台服务(admin 子域名)
server {
listen 443 ssl http2;
server_name admin.example.com;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

location / {
proxy_pass http://127.0.0.1:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

📁 方案二:基于路径分流(同域名)

🧱 架构示意

https://app.example.com/api/*    ──> Spring Boot (127.0.0.1:8080)
https://app.example.com/admin/* ──> 后台服务 (127.0.0.1:80)

🛠️ NGINX 配置

server {
listen 80;
server_name app.example.com;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl http2;
server_name app.example.com;

ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;

location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}

location /admin/ {
proxy_pass http://127.0.0.1:80;
proxy_set_header Host $host;
}

# 其他请求默认转发
location / {
proxy_pass http://127.0.0.1:80;
}
}

⚙️ Spring Boot 额外配置(真实 IP 支持)

如果需要在 Spring Boot 获取客户端真实 IP,需配置:

server.use-forward-headers=true

并在日志打印、业务逻辑中使用 X-Forwarded-For 获取 IP。


🛡️ 证书自动续期

使用 certbot 自动续期:

sudo certbot renew --dry-run

建议将其加入 crontab 实现定期自动续期。


🧠 常见问题

Q: 为什么微信小程序访问不了后端?

A: 小程序要求合法 HTTPS 域名,需配置:

  1. 通过微信公众平台配置 request合法域名(如 https://api.example.com
  2. 后端必须启用 HTTPS(443),并返回正确的 CORS 头(如 Access-Control-Allow-Origin

✅ 总结

项目多域名分流路径分流
配置复杂度中等较低
URL 结构清晰(api/admin 分开)路径区分略冗长
HTTPS 支持每个域名配置一次即可同一个 server 配置
推荐适用场景中大型项目、微信小程序小项目或调试阶段

📎 参考文档

---

如你需要,我可以将此笔记导出为 `.md` 文件或继续添加如 `proxy_cache`、WebSocket支持等高级配置。是否需要我导出或细化?